package com.jketing.entity.model.base;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 * SysCode 系统代码实体对象
 * 
 * @author  李荣华
 * @version v1.0
 * @date     2011-08-31
 * @since   JDK1.6
 */
@SuppressWarnings("serial")
@Entity
@Table(name = "t_Code",schema="dbo")
public class SysCode implements Serializable {
	/**
	 * id pk
	 */	
	private Integer id;
	/**
	 * parent  SysCode上级代码
	 */
	private SysCode parent;	
	/**
	 * name 代码类型名称
	 */
	private String name;
	/**
	 * enName 代码类型英文名称
	 */
	private String enName;
	/**
	 * typeCode  类别代码
	 */
	private int typeCode; 
	/**
	 * typeName  类别名称
	 */
	private String typeName; 
	/**
	 * orderNumber  排序号
	 */
	private int codeOrder; 
	/**
	 * children 本级所属下级列表
	 */
	private Set<SysCode> children = new HashSet<SysCode>();
	
	/**
	 * id pk
	 */	
	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * parent 由ParentId引用的上级代码对象
	 */
	@ManyToOne
	@JoinColumn(name = "Parentid")
	public SysCode getParent() {
		return parent;
	}
	public void setParent(SysCode parent) {
		this.parent = parent;
	}

	/**
	 * name 代码类型名称
	 */
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * enName 代码类型英文名称，不能重复
	 */
	@Column(name="enname")
	public String getEnName() {
		return enName;
	}
	public void setEnName(String enName) {
		this.enName = enName;
	}
	
	/**
	 * typeCode  类别代码
	 */
	@Column(name="typecode")
	public int getTypeCode() {
		return typeCode;
	}
	public void setTypeCode(int typeCode) {
		this.typeCode = typeCode;
	}	
	
	/**
	 * typeName  类别名称
	 */
	@Transient
	public String getTypeName() {
		if(typeCode == 1) {
			typeName = "类型"; 
		}
		else if(typeCode == 2){
			typeName = "属性";
		}
		return typeName;
	}
	public void setTypeName(String typeName) {
		this.typeName = typeName;
	}

	/**
	 * orderNumber  排序号
	 */
	@Column(name="codeorder")
	public int getCodeOrder() {
		return codeOrder;
	}
	public void setCodeOrder(int codeOrder) {
		this.codeOrder = codeOrder;
	}

	/**
	 * children 本机构下直接所属下级机构列表
	 */
	@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@OrderBy(value = "id ASC")
	public Set<SysCode> getChildren() {
		return children;
	}
	public void setChildren(Set<SysCode> children) {
		this.children = children;
	}
	
	/**
	 * 增加下级代码
	 * @param SysCode
	 */
	public void addSysCode(SysCode sysCode) {
		if (!this.children.contains(sysCode)) {
			this.children.add(sysCode);
			sysCode.setParent(this);
		}
	}
	/**
	 * 删除下级代码
	 * @param SysCode
	 */
	public void removeSysCode(SysCode sysCode) {
		if (this.children.contains(sysCode)) {
			sysCode.setParent(null);
			this.children.remove(sysCode);
		}
	}
	
	/**
	 * 返回对象的散列代码值。该实现根据此对象 中 id 字段计算散列代码值。
	 * 
	 * @return 此对象的散列代码值。
	 */
	@Override
	public int hashCode() {
		int hash = 0;
		hash += (this.id != null ? this.id.hashCode() : 0);
		return hash;
	}

	/**
	 * 确定其他对象是否等于此 Organ。当且仅当 参数不为 null 且该参数是具有与此对象相同 id 字段值的 Organ 对象时， 结果才为
	 * <code>true</code>。
	 * 
	 * @param 对象
	 *            ，要比较的引用对象 如果此对象与参数相同，则 @return <code>true</code>； 否则为
	 *            <code>false</code>。
	 */
	@Override
	public boolean equals(Object object) {
		if (!(object instanceof SysCode)) {
			return false;
		}
		SysCode other = (SysCode) object;
		if (this.id != other.id
				&& (this.id == null || !this.id.equals(other.id)))
			return false;
		return true;
	}

	/**
	 * 返回对象的字符串表示法。该实现根据 id 字段 构造此表示法。
	 * 
	 * @return 对象的字符串表示法。
	 */
	@Override
	public String toString() {
		return this.getClass().getName() + "[id=" + id + "]";
	}
}
